哇咔咔终于在这次网络赛中有所表现了,在学长的帮助下A出了一道模拟题,顺利获得现场赛名额,我表示很开心……不过废话不多说,还是补题吧……题目网址在此
##Mission Impossible 6
首先放我做出来的模拟题吧,花了十多分钟仔细研读了一遍题意,觉得可做,也是我唯一可做的了……于是就开始写,读读写写花了半个多小时,跑了一下样例,一个都没对,然后就开始调试,一个样例能找出我的一个bug,八个样例跑完,自信提交,wa,就开始找小黄鸭,然后又零零碎碎找出好几个bug,当我都要绝望的时候一发提交,竟然ac了!!!!果然模拟题还是不能放弃的啊。题意为你在监视一个人的文本输入,出现L表示光标左移,出现R表示光标右移,S表示切换输入方式,D表示删除右边的一个字符,B表示删除右边的一个字符,C会使其进入copy状态,此时除了LRD以外的所有输入都会使copy状态失效,copy状态时如果按D,则会删除所有从copy状态起始点到此时光标点的所有字符,如果在copy状态时再次按下C,则会把此时处于状态起始点和当前光标之间的字符串存入到粘贴板中,每次按下V会进行粘贴操作,需要注意的是任何会使字符串长度超过限制长度的操作都会被无视。
说说我遇到的几个坑点吧,首先粘贴操作之后光标的移动被我无视了,然后我以为在覆盖模式的时候是不用判断有没有超过文本限制的,其实不然。其他好像没啥记得的了……虽然当时错了很多,估计都是光标处理的时候的问题了。
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
#define ll long long
#define PI acos(-1)
using namespace std;
int main()
{
int t;
cin >> t;
while(t--)
{
int lim,pos = 0,modle = 0,copystatus = 0,st = 0,length = 0;
string s,poi,sv = "";
cin >> lim >> s;
for(int i = 0;i < s.size();i++)
{
//cout << i << " "; hfghfhhgh
//cout << poi << endl;
//cout << "length:" << length << endl;
if(s[i] == 'L')
{
pos = (pos == 0) ? 0 : pos - 1;
}
else if(s[i] == 'R')
{
pos = (pos == poi.size()) ? poi.size() : pos + 1;
}
else if(s[i] == 'S')
{
modle ^= 1;
copystatus = 0;
}
else if(s[i] == 'D')
{
if(pos != poi.size() && copystatus == 0)
{
poi.erase(pos,1);
}
else if(copystatus == 1)
{
if(pos < st)
{
poi.erase(pos,st - pos);
}
else
{
poi.erase(st,pos - st);
pos = st;
}
copystatus = 0;
st = 0;
}
}
else if(s[i] == 'B')
{
copystatus = 0;
if(pos != 0)
{
poi.erase(pos - 1,1);
pos--;
}
}
else if(s[i] == 'C')
{
if(copystatus == 0)
{
copystatus = 1;
st = pos;
}
else if(copystatus == 1)
{
if(pos < st)
{
sv = poi.substr(pos,st - pos);
}
else
{
sv = poi.substr(st,pos - st);
}
//cout << st << " " << length << endl;
st = 0;
copystatus = 0;
}
}
else if(s[i] == 'V')
{
copystatus = 0;
if(modle == 0)
{
if(sv.size() + poi.size() > lim)
continue;
else
{
poi.insert(pos,sv);
pos += sv.size();
}
}
else
{
if(pos + sv.size() > lim)
continue;
else
{
poi.erase(pos,min(sv.size(),poi.size() - pos));
poi.insert(pos,sv);
pos += sv.size();
}
}
}
else
{
copystatus = 0;
string us = "";
us += s[i];
if(modle == 0)
{
if(poi.size() != lim)
{
poi.insert(pos,us);
pos++;
}
}
else
{
if(pos != lim)
{
poi.erase(pos,1);
poi.insert(pos,us);
pos = (pos == poi.size()) ? poi.size() : pos + 1;
}
}
}
}
if(poi == "")
cout << "NOTHING\n";
else
cout << poi << endl;
}
}
##Fractal
当时是学长他们做出来的,我也不知道啥意思,刚才看了下,并不能懂,问了问别人。题意大概就是给你一个1*1的正方形,然后以各边的中点继续做正方形,做1000个,然后画一条x=k的直线(x在0~0.5之间)问你这条直线经过了多少个点。
答案是每减小一半,就会增加四个点,与边重合时有无数个点,用lower_bound就行了。
#include <bits/stdc++.h>
using namespace std;
int main(){
double a[555];
double cnt = 0.5;
for(int i = 0;i < 505;i++)
{
a[i] = 0.5 - cnt;
cnt *= 0.5;
}
int t;
cin >> t;
while(t--)
{
double s;
cin >> s;
int pos = lower_bound(a,a + 505,s) - a;
if(s == a[pos])
cout << -1 << endl;
else
cout << 4 * pos << endl;
}
return 0;
}
##The Cats’ Feeding Spots
水题。M个点,以任意一点为圆心求一个最小半径r,能否将n个点圈起来(边界不能有点)
暴力就行了……
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;
cin >> t;
pair<double,double>po[555];
double sv[555];
while(t--)
{
int n,m,ans = 9999999;
memset(sv,0,sizeof(sv));
cin >> m >> n;
for(int i = 0;i < m;i++)
{
cin >> po[i].first >> po[i].second;
}
for(int i = 0;i < m;i++)
{
memset(sv,0,sizeof(sv));
for(int j = 0;j < m;j++)
{
sv[j] = sqrt((po[i].first - po[j].first) * (po[i].first - po[j].first) + (po[i].second - po[j].second) * (po[i].second - po[j].second));
}
sort(sv,sv + m);
double R = ceil(sv[min(n,m) - 1]);
if(R == sv[min(n,m) - 1])
{
R +=1;
}
if(m != n && R >= sv[n])
continue;
ans = min((int)R,ans);
}
if(ans == 9999999)
cout << -1 << endl;
else
cout << ans << endl;
}
return 0;
}